﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GM.Model.SubSonic;

namespace GM.Forms
{
    public partial class NewAssetForm : Form
    {
        private readonly List<Pracownik> m_pracownicy;
        private List<faktury> m_faktury;
        private List<sale> m_sale;
        private readonly List<gm_kst> m_kst;
        private ReportForm m_report;
        private gm_srodki_trwale m_newSrodek;

        private bool m_nazwa;
        private bool m_nrFabryczny;
        private bool m_opis;
        private bool m_nrFaktury;
        private bool m_dataZakupu;
        private bool m_dataPrzyjecia;
        private bool m_kstValid;
        private bool m_wartosc;
        private bool m_sala;
        private bool m_osoba;

        public NewAssetForm(IEnumerable<Pracownik> pracownicy, IEnumerable<faktury> faktury, IEnumerable<sale> sale, IEnumerable<gm_kst> kst)
        {
            m_pracownicy = new List<Pracownik>(pracownicy);
            m_faktury = new List<faktury>(faktury);
            m_sale = new List<sale>(sale);
            m_kst = new List<gm_kst>(kst);

            InitializeComponent();
            m_report = new ReportForm {Visible = false};

            dtp_data_przyjecia.Value = DateTime.Today;
            dtpDataZakupu.Value = DateTime.Today;

            cmbx_nr_faktury.Items.AddRange(faktury.Select(x => x.nr_faktury).ToArray());
            cmbx_kst.Items.AddRange(kst.Select(x => string.Format("{0} - {1}", x.kod, x.nazwa.ToLowerInvariant())).ToArray());
            cmbx_osoba_odpowiedzialna.Items.AddRange(
                pracownicy.Select(x => string.Format("{0} {1}", x.imie, x.nazwisko)).ToArray());
            cmbx_lokalizacje.Items.AddRange(sale.Select(x => x.numer.ToString()).ToArray());
        }

        #region Forma

        private void NewAssetForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
            Hide();
        }

        private void NewAssetForm_VisibleChanged(object sender, EventArgs e)
        {
            tbxNumerEwidencyjny.Invoke(
                (MethodInvoker)delegate { tbxNumerEwidencyjny.Text = Guid.NewGuid().ToString(); });

        }
        #endregion

        #region Guziki

        private void btnOk_Click(object sender, EventArgs e)
        {
            if (!(m_nazwa && m_nrFabryczny && m_opis && m_nrFaktury && m_dataZakupu &&
                m_dataPrzyjecia && m_kstValid && m_wartosc && m_sala && m_osoba))
            {
                MessageBox.Show("Zweryfikuj dane.", "Uwaga", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            m_newSrodek = new gm_srodki_trwale
                              {
                                  data_amortyzacji = DateTime.Today.ToShortDateString(),
                                  data_przyjecia = dtp_data_przyjecia.Value.ToShortDateString(),
                                  data_zakupu = dtpDataZakupu.Value.ToShortDateString(),
                                  KST_id =
                                      m_kst.First(
                                          x => x.kod.ToString() == cmbx_kst.SelectedItem.ToString().Split(' ')[0]).kod,
                                  nazwa = tbx_nazwa.Text,
                                  id_faktury =
                                      m_faktury.First(x => x.nr_faktury == cmbx_nr_faktury.SelectedItem.ToString()).id,
                                  numer_fabryczny = tbx_numer_fabryczny.Text,
                                  opis = tbx_opis.Text,
                                  osoba_odpowiedzialna =
                                      m_pracownicy.First(
                                          x =>
                                          string.Format("{0} {1}", x.imie, x.nazwisko) ==
                                          cmbx_osoba_odpowiedzialna.SelectedItem.ToString()).id_prac,
                                  rodzaj_amortyzacji = "liniowa",
                                  umiejscowienie = int.Parse(cmbx_lokalizacje.SelectedItem.ToString()),
                                  umorzenie = 0.0f,
                                  wartosc = (double) nud_wartosc.Value,
                                  zlikwidowany = 0
                              };
            backgroundWorker.RunWorkerAsync(m_newSrodek);
            Clear();
            Hide();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            Clear();
            Hide();
        }
        #endregion

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var asset = (gm_srodki_trwale) e.Argument;
            SetProgress(true);
            asset.Save();
            SetProgress(false);
            AssetAdded();
            if(InvokeRequired)
            {
                BeginInvoke((MethodInvoker) Hide);
            }
            else
            {
                Hide();
            }
        }

        private void SetProgress(bool visible)
        {
            if (progressBar.InvokeRequired)
                progressBar.BeginInvoke((MethodInvoker)delegate { progressBar.Visible = visible; });
            else
                progressBar.Visible = visible;
        }

        private void Clear()
        {
            m_nazwa =
                m_nrFabryczny =
                m_opis =
                m_nrFaktury = m_dataZakupu = m_dataPrzyjecia = m_kstValid = m_wartosc = m_sala = m_osoba = false;

            tbx_nazwa.Text = tbx_opis.Text = tbx_numer_fabryczny.Text = tbxNumerEwidencyjny.Text = string.Empty;
        }

        #region Walidacja

        private void tbx_nazwa_Validated(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(tbx_nazwa.Text.Trim()))
            {
                errorProvider.SetError(tbx_nazwa, "Nazwa nie może być pusta.");
                m_nazwa = false;
            }
            else
            {
                errorProvider.SetError(tbx_nazwa, string.Empty);
                m_nazwa = true;
            }
        }

        private void tbx_numer_fabryczny_Validated(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(tbx_numer_fabryczny.Text.Trim()))
            {
                errorProvider.SetError(tbx_numer_fabryczny,"Numer fabryczny nie może być pusty");
                m_nrFabryczny = false;
            }
            else
            {
                errorProvider.SetError(tbx_numer_fabryczny, string.Empty);
                m_nrFabryczny = true;
            }
        }

        private void tbx_opis_Validated(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbx_numer_fabryczny.Text.Trim()))
            {
                errorProvider.SetError(tbx_opis, "Opis nie może być pusty");
                m_opis = false;
            }
            else
            {
                errorProvider.SetError(tbx_opis, string.Empty);
                m_opis = true;
            }
        }

        private void cmbx_nr_faktury_Validated(object sender, EventArgs e)
        {
            if(cmbx_nr_faktury.SelectedIndex==-1)
            {
                errorProvider.SetError(cmbx_nr_faktury, "Numer faktury nie może być pusty");
                m_nrFaktury = false;
            }
            else
            {
                errorProvider.SetError(cmbx_nr_faktury, string.Empty);
                m_nrFaktury = true;
            }
        }

        private void dtpDataZakupu_Validated(object sender, EventArgs e)
        {
            if (dtpDataZakupu.Value.Date > DateTime.Today)
            {
                errorProvider.SetError(dtpDataZakupu, "Data nie może pochodzić z przyszłości.");
                m_dataZakupu = false;
            }
            else
            {
                errorProvider.SetError(dtpDataZakupu, string.Empty);
                m_dataZakupu = true;
            }
        }

        private void cmbx_kst_Validated(object sender, EventArgs e)
        {
            if (cmbx_kst.SelectedIndex == -1)
            {
                errorProvider.SetError(cmbx_kst, string.Empty);
                m_kstValid = false;
            }
            else
            {
                errorProvider.SetError(cmbx_kst, string.Empty);
                m_kstValid = true;
            }
        }

        private void dtp_data_przyjecia_Validated(object sender, EventArgs e)
        {
            if (dtp_data_przyjecia.Value.Date > DateTime.Today)
            {
                errorProvider.SetError(dtp_data_przyjecia, "Data nie może pochodzić z przyszłości.");
                m_dataPrzyjecia = false;
            }
            else
            {
                errorProvider.SetError(dtp_data_przyjecia, string.Empty);
                m_dataPrzyjecia = true;
            }
        }

        private void cmbx_osoba_odpowiedzialna_Validated(object sender, EventArgs e)
        {
            if (cmbx_osoba_odpowiedzialna.SelectedIndex == -1)
            {
                errorProvider.SetError(cmbx_osoba_odpowiedzialna, "Wybierz osobę odpowiedzialną.");
                m_osoba = false;
            }
            else
            {
                errorProvider.SetError(cmbx_osoba_odpowiedzialna, string.Empty);
                m_osoba = true;
            }
        }

        private void cmbx_lokalizacje_Validated(object sender, EventArgs e)
        {
            if (cmbx_lokalizacje.SelectedIndex == -1)
            {
                errorProvider.SetError(cmbx_lokalizacje, "Wybierz salę.");
                m_sala = false;
            }
            else
            {
                errorProvider.SetError(cmbx_lokalizacje, string.Empty);
                m_sala = true;
            }
        }

        private void nud_wartosc_Validated(object sender, EventArgs e)
        {
            if (nud_wartosc.Value == 0.0m)
            {
                errorProvider.SetError(nud_wartosc,"Wartość nie może wynosić 0.");
                m_wartosc = false;
            }
            else
            {
                errorProvider.SetError(nud_wartosc, string.Empty);
                m_wartosc = true;
            }
        }
        #endregion

        public event Action AssetAdded = delegate { };

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            var id = gm_srodki_trwale.All().Select(x => x.nr_ewidencyjny).Max();
            var adapter = new evolutionDataSetTableAdapters.gm_srodki_trwaleTableAdapter();
            evolutionDataSet.gm_srodki_trwaleDataTable table = adapter.GetDataBy(id);
            m_report.Show("Srodki_trw_OT", table, "DataSet1");
        }
    }
}
